/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.ndj.daoimpl;


import br.com.ndj.conexao.FabricaConexao;
import br.com.ndj.dao.GrupoDAO;
import br.com.ndj.domain.Grupo;
import br.com.ndj.exceptions.FabricaConexaoPoolVazioException;
import br.com.ndj.exceptions.GrupoDAOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Osmar Vilarim
 * 18/09/2014
 */

public class GrupoDAOImpl implements GrupoDAO {
    
    private Connection conn = null;
    private String sql = "";
    private PreparedStatement pstmt = null;
    private List<Grupo> listGrupo = new ArrayList<Grupo>();
    
    
    public GrupoDAOImpl() {
        try {
            //conn = new FabricaConexao().abrirConexao();
            conn = FabricaConexao.getInstance().getConnectionFromPool();
        } catch (FabricaConexaoPoolVazioException ex) {
            //Logger.getLogger(LoginDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public boolean cadastrarGrupo(Grupo grupo) throws GrupoDAOException{
        boolean retorno = false;

        if (grupo != null) {

            try {

                conn.setAutoCommit(false);
                sql = "INSERT INTO grp_grupo (GRP_GRUPO) VALUES (?)";
                pstmt = conn.prepareStatement(sql);

                pstmt.setString(1, grupo.getGrpGrupo().trim());
                
                int rows = pstmt.executeUpdate();

                if (rows > 0) {
                    System.out.println("Quantidade de linhas inseridas no banco: " + rows);
                }
                conn.commit();
                pstmt.close();

                retorno = true;
            } catch (SQLException e) {

                try {
                    conn.rollback();
                } catch (SQLException x) {
                    throw new GrupoDAOException(GrupoDAOException.ERRO_INSERIR_GRUPO, null);
                }

                throw new GrupoDAOException(GrupoDAOException.ERRO_INSERIR_GRUPO, null);
            } finally {
                FabricaConexao.getInstance().returnConnectionToPool(conn);
            }

        }

        return retorno;
    }

    @Override
    public boolean editarGrupo(Grupo grupo) throws GrupoDAOException {
         boolean retorno = false;

        if (grupo != null) {

            try {
                conn.setAutoCommit(false);
                sql = "";
                sql = "UPDATE grp_grupo SET GRP_GRUPO = ? WHERE GRP_IDENTIFICADOR = ?";

                pstmt = conn.prepareStatement(sql);
                pstmt.setString(1, grupo.getGrpGrupo());
                pstmt.setInt(2, grupo.getGrpIdentificador());

                int rows = pstmt.executeUpdate();

                if (rows > 0) {
                    System.out.println("Quantidade de linhas inseridas no banco: " + rows);
                    retorno = true;
                }
                conn.commit();
                pstmt.close();

            } catch (SQLException ex) {
                
                try {
                    conn.rollback();
                } catch (SQLException e1) {
                    throw new GrupoDAOException(GrupoDAOException.ERRO_ALTERAR_GRUPO, null);
                }
                
                throw new GrupoDAOException(GrupoDAOException.ERRO_ALTERAR_GRUPO, null);

            } finally {
                FabricaConexao.getInstance().returnConnectionToPool(conn);
            }
        }
        return retorno;
    }

    @Override
    public boolean excluirGrupo(Grupo grupo) throws GrupoDAOException {
        boolean retorno = false;

        try {

            if (grupo.getGrpIdentificador()!= 0) {
                sql = "DELETE FROM grp_grupo where GRP_IDENTIFICADOR = ?";
                pstmt = conn.prepareStatement(sql);
                pstmt.setInt(1, grupo.getGrpIdentificador());
            }

        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }

        try {

            conn.setAutoCommit(false);

            int rows = pstmt.executeUpdate();

            if (rows > 0) {
                System.out.println("Quantidade de linhas excluídas no banco: " + rows);
            }
            conn.commit();
            pstmt.close();

            retorno = true;
        } catch (SQLException e) {

            try {
                conn.rollback();
            } catch (SQLException e1) {
                throw new GrupoDAOException(GrupoDAOException.ERRO_EXCLUIR_GRUPO, null);
            }

            throw new GrupoDAOException(GrupoDAOException.ERRO_EXCLUIR_GRUPO, null);
        } finally {
            FabricaConexao.getInstance().returnConnectionToPool(conn);
        }

        return retorno;
    }

    @Override
    public List<Grupo> listarGrupo() throws GrupoDAOException {
        listGrupo = new ArrayList<Grupo>();
        
        try {
            sql = "SELECT GRP_IDENTIFICADOR,GRP_GRUPO FROM grp_grupo";
            pstmt = conn.prepareStatement(sql);

            ResultSet rs = pstmt.executeQuery();

            while (rs.next()) {
                
                Grupo grupo = new Grupo();
                
                grupo.setGrpIdentificador(rs.getInt("GRP_IDENTIFICADOR"));
                grupo.setGrpGrupo(rs.getString("GRP_GRUPO"));
  
                this.listGrupo.add(grupo);

            }//fim while

            pstmt.close();

        } catch (SQLException e) {
            throw new GrupoDAOException(GrupoDAOException.ERRO_LISTAR_GRUPO, null);
        } finally {
            FabricaConexao.getInstance().returnConnectionToPool(conn);
        }

        return this.listGrupo;
    }

    @Override
    public List<Grupo> listarGrupo(Grupo grupo) throws GrupoDAOException {
        listGrupo = new ArrayList<Grupo>();
        
        try {

            sql = "SELECT GRP_IDENTIFICADOR,GRP_GRUPO FROM grp_grupo where GRP_GRUPO like ?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, "%"+grupo.getGrpGrupo()+"%");

            ResultSet rs = pstmt.executeQuery();

            while (rs.next()) {
                
                grupo = new Grupo();
                
                grupo.setGrpIdentificador(rs.getInt("GRP_IDENTIFICADOR"));
                grupo.setGrpGrupo(rs.getString("GRP_GRUPO"));
                
                this.listGrupo.add(grupo);

            }//fim while

            pstmt.close();

        } catch (SQLException e) {
            throw new GrupoDAOException(GrupoDAOException.ERRO_LISTAR_GRUPO, null);
        } finally {
            FabricaConexao.getInstance().returnConnectionToPool(conn);
        }

        return this.listGrupo;
    }
    
    
    
}
